Abs

对输入数组逐元素计算绝对值。实数取数值绝对值;复数取模长。

\[\begin{split}\mathrm{output}_i = \begin{cases} |\mathrm{input}_i|, & \text{实数} \\ \bigl(\Re(\mathrm{input}_i)^2 + \Im(\mathrm{input}_i)^2\bigr)^{1/2}, & \text{复数} \end{cases}\end{split}\]
输入:
  • input - 输入数据地址;c64 / c128 为交错实部/虚部([re, im, ...]

  • length - 元素个数;复数时为复数个数(不是 float 个数)

  • core_mask - 核掩码(仅共享存储版本使用)

输出:
  • output - 输出地址;实数类型与输入同型;复数输出为模长(float / double

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 int8、int16、int32、fp32、fp64、cplx64、cplx128

  • MT7004 支持 int16、int32、fp16、fp32、cplx64

  • c64_abs:输入 float 交错 [re, im, …],输出 float 模长

  • c128_abs:输入 double 交错 [re, im, …],输出 double 模长

共享存储版本:

void i8_abs_s(int8_t *input, int8_t *output, int length, int core_mask)
void i16_abs_s(int16_t *input, int16_t *output, int length, int core_mask)
void i32_abs_s(int32_t *input, int32_t *output, int length, int core_mask)
void hp_abs_s(float16 *input, float16 *output, int length, int core_mask)
void fp_abs_s(float *input, float *output, int length, int core_mask)
void dp_abs_s(double *input, double *output, int length, int core_mask)
void c64_abs_s(float *input, float *output, int length, int core_mask)
void c128_abs_s(double *input, double *output, int length, int core_mask)

C调用示例:

 1// MT7004 示例(共享存储多核,DDR 地址)
 2void TestAbsSMCFp32(int length, int core_mask) {
 3    int core_id = get_core_id();
 4    int logic_core_id = GetLogicCoreId(core_mask, core_id);
 5    int core_num = GetCoreNum(core_mask);
 6    float *input = (float *)0x81000000;
 7    float *output = (float *)0x82000000;
 8    sys_bar(0, core_num);
 9    fp_abs_s(input, output, length, core_mask);
10}
11
12void main() {
13    int core_mask = 0b1111;
14    TestAbsSMCFp32(1024, core_mask);
15}

私有存储版本:

void i8_abs_p(int8_t *input, int8_t *output, int length)
void i16_abs_p(int16_t *input, int16_t *output, int length)
void i32_abs_p(int32_t *input, int32_t *output, int length)
void hp_abs_p(float16 *input, float16 *output, int length)
void fp_abs_p(float *input, float *output, int length)
void dp_abs_p(double *input, double *output, int length)
void c64_abs_p(float *input, float *output, int length)
void c128_abs_p(double *input, double *output, int length)

C调用示例:

 1// MT7004 示例(私有存储单核,AM 地址)
 2void TestAbsAMFp32(int length) {
 3    float *input = (float *)0x10010000;
 4    float *output = (float *)0x10020000;
 5    fp_abs_p(input, output, length);
 6}
 7
 8void main() {
 9    TestAbsAMFp32(1024);
10}